/* const a: number = 10
// a = '你好世界'
console.log(a);
let b: boolean;

 */
/* let a:any = 10
a = '你好世界'

console.log(a);

// void函数没有返回值
function fn():number{
  return 'dwefrgthyj'
}
fn() */

// 数组1 类型  直接定义类型
/* const arr: number[] = [1,2,3,4];
const arr2: string[] = ['a', 'b', 10]
const arr3: object[] = [{a: 10}, {b: 20}, 10]

console.log(arr, arr2, arr3); */
/* // 定义数组第二种方法 泛型  函数<类型>
const arr: Array<string> = ['a', 'b', 'c']
console.log(arr); */

// 元组

/* const arr: [string, number, boolean] = ['a', 10, true];
console.log(arr); */

// 函数 1 声明式函数
// 注意 声明 参数类型 和返回值得类型
/* function fn(a: number, b: number):number{
  return a+b
}
fn(10, 20)
// 函数 1 赋值式函数
// 注意 声明 参数类型 和返回值得类型
const fn2 = (a: string, b:string):void => {
  console.log(a+b);
  
}
fn2('a', 'b')
 */

/* // 可选参数
const fn = (a: string, b?:string) => {
  console.log(a+b);
  
}
fn('a', 'b') */

/* // 默认值，语法同 js 不同点 默认值 允许不是最后一个 传值 使用undefined占位

const fn = (a: string = '默认值', b: string) => {
  console.log(a+b);
  
}

fn(undefined, '这是b的值') */

// interface 接口 可以自定义一个数据类型用来描述 对象（具体结构）
// 声明对象不建议使用object 需要使用接口来定义
/* interface Person {
  a: string,
  readonly b: number,
  // 可选属性
  c?: number[]
}

const obj: Person = {
  a: '10',
  b: 20
}
obj.a = 'dwhifwfw'
// obj.b = 200
console.log(obj); */


// 联合类型
/* function fn(a: number | string) {
  // 类型断言
  const b = a as string;
  if (b.length) {
    console.log(b.slice(0, 20));
    
  } else {
    // 不是字符串 但是我已经断言成字符串 不能用number api
    // 继续断言 为number
    const c = a as number;
    console.log(c.toFixed(2));
    
  }
  
  
}
fn(10) */
// 使用类型别名 定义对象结构  替换 interface

/* interface Person{
  a: string,
  b: number,
  c?: number[] 
} */
/* type Person = {
  a: string,
  b: number,
  c?: number[] 
}

function fn (obj: Person) {
  console.log(obj);
  
}

fn({a: 'aaa', b: 29}) */

/* function fn (obj: {
  a: string,
  b: number,
  c?: number[] 
}) {
  console.log(obj);
  
}

fn({a: 'aaa', b: 29}) */
/* function fn<T> (a: T): T{
  return a
}
fn<string>('你好世界')
fn<number>(20)
 */
// const arr: Array<number> = [1,2,3,4]
// export default 10

// 导出接口  或者 type 类型
interface Person{
  a: string,
  b: number,
  c?: number[] 
}

export default Person